package dispatcher;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import services.PollService;
import services.UserService;
import utils.MyBase64;
import utils.Utils;
import business.Button;
import business.CompanyCampaign;
import business.CompanyPoll;
import business.LocalMenu;
import business.PollParams;
import dao.ObjectDao;

public class Menu extends HttpServlet{

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		UserService userService = null;
		
		HttpSession session = request.getSession(true);
		Object userID = session.getAttribute("userID");
		Object sessionUserRole = session.getAttribute("userRole");
		String companyCampaignIDStr = request.getParameter("id");
		
		Long companyCampaignID;
		if(userID == null || userID.toString().trim().length() == 0)
		{
			response.sendRedirect("./login?option=" + MyBase64.encode(Login.NO_SESSION.getBytes()));
		}
		else
		{
			String page = "/menu.jsp";
			if(companyCampaignIDStr != null && companyCampaignIDStr.trim().length() > 0)
			{
				ObjectDao dao = new ObjectDao();
				userService = new UserService();
				
				companyCampaignID = Long.valueOf(companyCampaignIDStr);
				CompanyCampaign companyCampaign = dao.getCompanyCampaignStatus(companyCampaignID);
				
				Long pollStatusID = companyCampaign.getPollStatus().getId();		
				request.setAttribute("companyStatus", pollStatusID);
				String cuit = companyCampaign.getCompany().getCuit().toString();
				request.setAttribute("companyName", cuit.substring(0,2) + "-" + cuit.substring(2, 10) + "-" + cuit.substring(10) );
				request.setAttribute("companyTitle", companyCampaign.getCampaign().getDescription());
				List<Button> buttonList = userService.getButtonsByRoleAndPollStatus(sessionUserRole.toString(), pollStatusID);
				
				if(buttonList != null && buttonList.size() > 0)
				{
					boolean hasActions = false;
					for(Button button : buttonList)
					{
						if(button.getButton().equals(Button.BUTTON_ENC_VALIDATE))
						{
							request.setAttribute("attBtnEncValidate","true");
							hasActions = true;
						}
						else if(button.getButton().equals(Button.BUTTON_ENC_SEND))
						{
							request.setAttribute("attBtnEncSend","true");
							hasActions = true;
						}
						else if(button.getButton().equals(Button.BUTTON_ENC_REJECT))
						{
							request.setAttribute("attBtnEncReject","true");
							hasActions = true;
						}
						else if(button.getButton().equals(Button.BUTTON_ENC_APPROVE))
						{
							request.setAttribute("attBtnEncApprove","true");
							hasActions = true;
						}
						else if(button.getButton().equals(Button.BUTTON_ENC_REGIONALIZE))
						{
							request.setAttribute("attBtnEncRegionalize","true");
							hasActions = true;
						}
					}
					if(hasActions)
					{
						request.setAttribute("attHasActions","true");	
					}
				}
				
				session.setAttribute("companyStatus", pollStatusID);
				session.setAttribute("companyCampaign", companyCampaignID);				
				PollParams parametrosEncuesta = new PollParams();
				StringBuilder strParams = null;  
				//__________________________
				
			//Trae Todos Los Formularios Relacionados a la Empresa "E","PB","EEPN", etc. No trae Locales ni anexos
				
				List<CompanyPoll> companyPolls = dao.getCompanyPollsOnly(companyCampaignID);
				
				if(companyPolls != null && companyPolls.size() > 0)
					
				{
					List<PollParams> listaCompanyPolls = new ArrayList<PollParams>();
					for(CompanyPoll companyPoll : companyPolls)
					{
						parametrosEncuesta = new PollParams();
						
						parametrosEncuesta.setName(companyPoll.getPoll().getName());
						parametrosEncuesta.setStatus(companyPoll.getFormStatus().getId());
						parametrosEncuesta.setCampaign(companyCampaignID);
						strParams = new StringBuilder();
						strParams.append(companyCampaignIDStr);
						strParams.append("|");
						strParams.append(companyPoll.getPoll().getId());
						strParams.append("|");
						strParams.append("0");
						parametrosEncuesta.setParams(MyBase64.encode(strParams.toString().getBytes("UTF-8")));
						listaCompanyPolls.add(parametrosEncuesta);
					}
					request.setAttribute("companyPollsList", listaCompanyPolls);	
				}
				else
				{
					//TODO NO ESTAN LAS ENCUESTAS EN LA BASE DE DATOS -MOSTRAR MENSAJE-
				}
  //______________________________________________
				// Trae Locales
				List<LocalMenu> localesEmpresa = dao.getLocalsOnly(companyCampaignID);
				
				if(localesEmpresa != null && localesEmpresa.size() > 0)
				{
					List<PollParams> listaLocales = new ArrayList<PollParams>();
					String localStr = null;
					for(LocalMenu localMenu : localesEmpresa)
					{
						parametrosEncuesta = new PollParams();
						parametrosEncuesta.setLocal(localMenu.getLocal().getId().toString());
						localStr = Utils.getLocalLabel(localMenu.getLocal());
						parametrosEncuesta.setName(localStr);
						
						listaLocales.add(parametrosEncuesta);
					}
					request.setAttribute("localsList", listaLocales);

					//______________________________________________
					
					List<PollParams> listaEncuestas = new ArrayList<PollParams>();
					for(LocalMenu localMenu : localesEmpresa)
					{
						if(localMenu.getLocalPoll() != null)
						{
							parametrosEncuesta = new PollParams();
							parametrosEncuesta.setLocal(localMenu.getLocal().getId().toString());
							parametrosEncuesta.setName(localMenu.getLocalPoll().getPoll().getName());
							parametrosEncuesta.setStatus(localMenu.getLocalPoll().getFormStatus().getId());
							parametrosEncuesta.setCampaign(companyCampaignID);
							strParams = new StringBuilder();
							strParams.append(companyCampaignIDStr);
							strParams.append("|");
							strParams.append(localMenu.getLocalPoll().getPoll().getId());
							strParams.append("|");
							strParams.append(localMenu.getLocal().getId());
							parametrosEncuesta.setParams(MyBase64.encode(strParams.toString().getBytes("UTF-8")));					
							listaEncuestas.add(parametrosEncuesta);
						}
						if(localMenu.getRegionalizedLocalPoll() != null)
						{
							parametrosEncuesta = new PollParams();
							parametrosEncuesta.setLocal(localMenu.getLocal().getId().toString());
							parametrosEncuesta.setName(localMenu.getRegionalizedLocalPoll().getPoll().getName());
							parametrosEncuesta.setStatus(localMenu.getRegionalizedLocalPoll().getFormStatus().getId());
							parametrosEncuesta.setCampaign(companyCampaignID);
							strParams = new StringBuilder();
							strParams.append(companyCampaignIDStr);
							strParams.append("|");
							strParams.append(localMenu.getRegionalizedLocalPoll().getPoll().getId());
							strParams.append("|");
							strParams.append(localMenu.getLocal().getId());
							parametrosEncuesta.setParams(MyBase64.encode(strParams.toString().getBytes("UTF-8")));				
							listaEncuestas.add(parametrosEncuesta);
						}
						
				for(CompanyPoll companyPoll : localMenu.getAnnexes())
						{
							if((companyPoll.getPoll().getId() != PollService.POLL_L_ID) && (companyPoll.getPoll().getId() != PollService.POLL_LR_ID) )
							{
								parametrosEncuesta = new PollParams();
								parametrosEncuesta.setLocal(localMenu.getLocal().getId().toString());
								parametrosEncuesta.setName(companyPoll.getPoll().getName());
								parametrosEncuesta.setStatus(companyPoll.getFormStatus().getId());
								parametrosEncuesta.setCampaign(companyCampaignID);
								strParams = new StringBuilder();
								
								strParams.append(companyCampaignIDStr);
								strParams.append("|");
								strParams.append(companyPoll.getPoll().getId());
								strParams.append("|");
								strParams.append(localMenu.getLocal().getId());
								parametrosEncuesta.setParams(MyBase64.encode(strParams.toString().getBytes("UTF-8")));
								listaEncuestas.add(parametrosEncuesta);	
							}
						}
					}
					request.setAttribute("annexesList", listaEncuestas);
	//______________________________________________
					
					// Trae Anexos
				}
				else 
				{
					//TODO NO ESTAN LAS ENCUESTAS EN LA BASE DE DATOS -MOSTRAR MENSAJE-
				}				
				RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
			    dispatcher.forward(request, response);
			}
			else
			{
				page = Utils.getMessagePage(Utils.MESSAGE_TYPE_ERROR,
				"No se encontr&oacute; la empresa en la base de datos.");
				response.sendRedirect(page);
			}
		}
	}

}
